package fileIO;

/*
 * 1, 前54个字是头 - 类型、总字节量、宽度、高度
 2, 第18字节到21字节是宽度
 3, 第22字节到25字节是高度
 4, 54字节之后是每个像素的数据
 5, 每像素颜色以RGB表示，三个字节
 6, 每个扫描行的字节量必须是4的倍数，不足用空字节补齐
 7, 宽度、高度、像素RGB
 都是以低字节序排列
 8, 像素是以从左到又，从下到上排列
 */
import java.io.File;
import java.io.IOException;
import java.io.RandomAccessFile;

public class Bmp {
	private int width;

	private int height;

	private RandomAccessFile raf;

	public Bmp(File bmpFile) throws IOException {
		raf = new RandomAccessFile(bmpFile, "rw");
		raf.seek(18);
		width = raf.readInt();
		width = ((width >> 24) & 0xff) | ((width >> 8) & 0xff00)
				| ((width << 8) & 0xff0000) | ((width << 24));
		height = raf.readInt();
		height = ((height >> 24) & 0xff) | ((height >> 8) & 0xff00)
				| ((height << 8) & 0xff0000) | ((height << 24));
	}

	public void reverse() throws IOException {// 图像反色
		raf.seek(54);
		while (raf.getFilePointer() < raf.length()) {
			int b = raf.read();// 取出每个rgb
			b = ~b;// 反色
			raf.seek(raf.getFilePointer() - 1);// 指针后退
			// 将反色的rgb写入原文件
			raf.write(b);
		}
		raf.close();
	}

	public static void main(String[] args) throws IOException {
		Bmp bmp = new Bmp(new File("/home/tarena/Desktop/2.bmp"));
		bmp.reverse();
	}

}
